home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / faq / vol15n14.zip / DDGAME.ZIP / SPACEFRM.CPP < prev    next >
C/C++ Source or Header  |  1996-05-07  |  22KB  |  843 lines

  1. // SpaceFrame.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "SpaceFrm.h"
  6. #include "Error.h"
  7. #include "anim.h"
  8.  
  9. #include <mmsystem.h>
  10. #include <math.h>
  11.  
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17.  
  18. double DirX[32] =
  19. {
  20.   0.000000,
  21.   0.195090,
  22.   0.382683,
  23.   0.555570,
  24.   0.707107,
  25.   0.831470,
  26.   0.923880,
  27.   0.980785,
  28.   1.000000,
  29.   0.980785,
  30.   0.923880,
  31.   0.831470,
  32.   0.707107,
  33.   0.555570,
  34.   0.382683,
  35.   0.195090,
  36.   0.000000,
  37.   -0.195090,
  38.   -0.382683,
  39.   -0.555570,
  40.   -0.707107,
  41.   -0.831470,
  42.   -0.923880,
  43.   -0.980785,
  44.   -1.000000,
  45.   -0.980785,
  46.   -0.923880,
  47.   -0.831470,
  48.   -0.707107,
  49.   -0.555570,
  50.   -0.382683,
  51.   -0.195090
  52. };
  53.  
  54. double DirY[32] =
  55. {
  56.   -1.0,
  57.   -0.980785,
  58.   -0.92388,
  59.   -0.83147,
  60.   -0.707107,
  61.   -0.55557,
  62.   -0.382683,
  63.   -0.19509,
  64.   0.0,
  65.   0.19509,
  66.   0.382683,
  67.   0.55557,
  68.   0.707107,
  69.   0.83147,
  70.   0.92388,
  71.   0.980785,
  72.   1.0,
  73.   0.980785,
  74.   0.92388,
  75.   0.83147,
  76.   0.707107,
  77.   0.55557,
  78.   0.382683,
  79.   0.19509,
  80.   0.0,
  81.   -0.19509,
  82.   -0.382683,
  83.   -0.55557,
  84.   -0.707107,
  85.   -0.83147,
  86.   -0.92388,
  87.   -0.980785
  88. };
  89.  
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CSpaceFrame
  92.  
  93. //-----------------------------------------------------------------------------
  94. // default constructor
  95. //-----------------------------------------------------------------------------
  96. CSpaceFrame::CSpaceFrame()
  97. {
  98.   m_pFrameRateSurface = NULL;
  99.  
  100.     m_dwStartTime = 0;
  101.     m_nFrameCount = 0;
  102.   m_nFrameRate= 0;
  103.  
  104.   m_ddbltfx.dwSize = sizeof(DDBLTFX);
  105.   m_ddsd.dwSize = sizeof(DDSURFACEDESC);
  106.  
  107.   m_nLives = 3;
  108.   m_nTurnDelay = 0;
  109.   m_nLevel = 0;
  110.  
  111.   // seed random number generator
  112.   srand(::timeGetTime());
  113. }
  114.  
  115. CSpaceFrame::~CSpaceFrame()
  116. {
  117. }
  118.  
  119. //-----------------------------------------------------------------------------
  120. // GetWindowTitle
  121. //-----------------------------------------------------------------------------
  122. CString CSpaceFrame::GetWindowTitle()
  123. {
  124.   return "Space Demo";
  125. }
  126.  
  127. //-----------------------------------------------------------------------------
  128. // UpdateGame
  129. //-----------------------------------------------------------------------------
  130. BOOL CSpaceFrame::UpdateGame()
  131. {
  132.   // If its ESC, we quit the app
  133.     if (::GetAsyncKeyState(VK_ESCAPE) < 0)
  134.     {
  135.         return FALSE;
  136.     }
  137.  
  138.   MoveSprites();
  139.   CollideSprites();
  140.   
  141.   // out of lives, game over man
  142.   if (m_nLives <= 0)
  143.   {
  144.     DisplayMessage("Game Over");
  145.     return FALSE;
  146.   }
  147.  
  148.   // Erase the background
  149.   m_ddbltfx.dwFillColor = 0;
  150.   while (TRUE)
  151.   {
  152.     HRESULT ddrval;
  153.     ddrval = m_pBackBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &m_ddbltfx);
  154.     if (ddrval == DD_OK)
  155.       break;
  156.  
  157.     if (ddrval == DDERR_SURFACELOST)
  158.       if (!RestoreSurfaces())
  159.           return FALSE;
  160.  
  161.     if (ddrval != DDERR_WASSTILLDRAWING)
  162.       break;
  163.   }
  164.  
  165.   DrawSprites();
  166.  
  167.   DrawText();
  168.  
  169.   // Everyhting is ready in the back buffer, so flip
  170.   m_pFrontBuffer->Flip(NULL, DDFLIP_WAIT);
  171.  
  172.   return TRUE;
  173. }
  174.  
  175. //-----------------------------------------------------------------------------
  176. // MoveSprites
  177. //-----------------------------------------------------------------------------
  178. void CSpaceFrame::MoveSprites()
  179. {
  180.   SPRITE *pHold, *pCurr;
  181.   BOOL bCollision;
  182.   int nNumEnemies = 0;
  183.  
  184.   pCurr = &m_head;
  185.   // move the sprites and detect edge of screen hits
  186.   do
  187.   {
  188.     switch (pCurr->eType) 
  189.     {
  190.       case typeShip:
  191.         pCurr->nDelay++;
  192.         if (pCurr->nDelay >= ANIM_DELAY)
  193.         {
  194.           pCurr->nDelay = 0;
  195.  
  196.           if (::GetAsyncKeyState(VK_CONTROL) < 0)
  197.           {
  198.             AddSprite(typeBullet, pCurr->dPosX, pCurr->dPosY);
  199.           }
  200.         }
  201.  
  202.         if (::GetAsyncKeyState(VK_RIGHT) < 0)
  203.         {
  204.           if (m_nTurnDelay > TURN_DELAY)
  205.           {
  206.             m_nTurnDelay = 0;
  207.  
  208.             ++pCurr->nDirection;
  209.             if (pCurr->nDirection >= NUM_DIRECTIONS)
  210.               pCurr->nDirection = 0;
  211.           }
  212.           else
  213.             m_nTurnDelay++;
  214.         }
  215.  
  216.         if (::GetAsyncKeyState(VK_LEFT) < 0)
  217.         { 
  218.           if (m_nTurnDelay > TURN_DELAY)
  219.           {
  220.             m_nTurnDelay = 0;
  221.             --pCurr->nDirection;
  222.             if (pCurr->nDirection < 0)
  223.               pCurr->nDirection = NUM_DIRECTIONS - 1;
  224.           }
  225.           else
  226.             m_nTurnDelay++;
  227.         }
  228.  
  229.         if (::GetAsyncKeyState(VK_UP) < 0)
  230.         {
  231.           pCurr->dVelX += DirX[pCurr->nDirection] / 10;
  232.           pCurr->dVelY += DirY[pCurr->nDirection] / 10;
  233.         }
  234.  
  235.         if (::GetAsyncKeyState(VK_DOWN) < 0)
  236.         {
  237.           pCurr->dVelX = 0.0;
  238.           pCurr->dVelY = 0.0;
  239.         }
  240.  
  241.  
  242.         pCurr->dPosX += pCurr->dVelX;
  243.         pCurr->dPosY += pCurr->dVelY;
  244.  
  245.         pCurr->nFrame = pCurr->nDirection;
  246.         
  247.         break;
  248.  
  249.       case typeEnemy:
  250.         nNumEnemies++;
  251.       case typeBullet:
  252.         pCurr->dPosX += pCurr->dVelX;
  253.         pCurr->dPosY += pCurr->dVelY;
  254.  
  255.         pCurr->nDelay++;
  256.         if (pCurr->nDelay >= ANIM_DELAY)
  257.         {
  258.           pCurr->nDelay = 0;
  259.           pCurr->nFrame++;
  260.           if (pCurr->nFrame >= pCurr->pAnim->GetNumFrames())
  261.             pCurr->nFrame = 0;
  262.         }
  263.  
  264.         break;
  265.     } 
  266.  
  267.     // reverse direction when hitting edge of world
  268.     bCollision = FALSE;
  269.     if (int(pCurr->dPosX) < WORLD_MIN_X)
  270.     {
  271.       pCurr->dVelX *= -1;
  272.       pCurr->dPosX = WORLD_MIN_X;
  273.       bCollision = TRUE;
  274.     }
  275.  
  276.     if (int(pCurr->dPosY) < WORLD_MIN_Y)
  277.     {
  278.       pCurr->dVelY *= -1;
  279.       pCurr->dPosY = WORLD_MIN_Y;
  280.       bCollision = TRUE;
  281.     }
  282.  
  283.     if ((int(pCurr->dPosX) + pCurr->pAnim->GetWidth()) > WORLD_MAX_X)
  284.     {
  285.       pCurr->dVelX *= -1;
  286.       pCurr->dPosX = WORLD_MAX_X - pCurr->pAnim->GetWidth();
  287.       bCollision = TRUE;
  288.     }
  289.  
  290.     if ((int(pCurr->dPosY) + pCurr->pAnim->GetHeight()) > WORLD_MAX_Y)
  291.     {
  292.       pCurr->dVelY *= -1;
  293.       pCurr->dPosY = WORLD_MAX_Y - pCurr->pAnim->GetHeight();
  294.       bCollision = TRUE;
  295.     } 
  296.     
  297.     // remove bullets if they go off the edge of the world 
  298.     if (typeBullet == pCurr->eType && bCollision)
  299.     {
  300.       pHold = pCurr->pNext;
  301.       RemoveSprite(pCurr);
  302.       pCurr = pHold;
  303.     }
  304.     else
  305.       pCurr = pCurr->pNext;
  306.  
  307.   } while (pCurr != &m_head);
  308.  
  309.   if (nNumEnemies == 0)
  310.   {
  311.     KillLevel();
  312.     InitLevel();
  313.   }
  314. }
  315.  
  316. //-----------------------------------------------------------------------------
  317. // CollideSprites
  318. //-----------------------------------------------------------------------------
  319. void CSpaceFrame::CollideSprites()
  320. {
  321.   SPRITE *pHold, *pTarget, *pCurr;
  322.   BOOL bCollision;
  323.  
  324.   pCurr = &m_head;
  325.   do
  326.   {
  327.     bCollision = FALSE;
  328.     if (pCurr->eType != typeBullet && pCurr->eType != typeShip)
  329.     {
  330.       pCurr = pCurr->pNext;
  331.       continue;
  332.     }
  333.  
  334.     pTarget = m_head.pNext;
  335.     do
  336.     {
  337.       if (pTarget->eType == typeBullet || pTarget == pCurr)
  338.       {
  339.         pTarget = pTarget->pNext;
  340.         continue;
  341.       }
  342.       
  343.       int nX = int(pCurr->dPosX) + (pCurr->pAnim->GetWidth() / 2);
  344.       int nY = int(pCurr->dPosY) + (pCurr->pAnim->GetHeight() / 2);
  345.  
  346.       if (nX > pTarget->dPosX &&
  347.           nY > pTarget->dPosY &&
  348.           nX < (pTarget->dPosX + pTarget->pAnim->GetWidth()) &&
  349.           nY < (pTarget->dPosY + pTarget->pAnim->GetHeight()))
  350.       {
  351.         bCollision = TRUE;
  352.  
  353.         pHold = pTarget->pNext;
  354.         RemoveSprite(pTarget);
  355.         pTarget = pHold;
  356.       }  
  357.       else
  358.         pTarget = pTarget->pNext;
  359.     } while (pTarget != &m_head);
  360.  
  361.     if (bCollision)
  362.     {
  363.       if (pCurr->eType == typeShip)
  364.       {
  365.         m_nLives--;
  366.  
  367.         m_head.dPosX = 300.0;
  368.         m_head.dPosY = 200.0;
  369.         m_head.dVelX = 0.0;
  370.         m_head.dVelY = 0.0;
  371.         m_head.nDirection = m_head.nFrame = m_head.nDelay = 0;
  372.       }
  373.       else
  374.       {
  375.         pHold = pCurr->pNext;
  376.         RemoveSprite(pCurr);
  377.         pCurr = pHold;
  378.       }
  379.     }
  380.     else
  381.       pCurr = pCurr->pNext;
  382.   } while (pCurr != &m_head);  
  383. }
  384.  
  385. //------